package com.company.genealogy.web.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.company.genealogy.web.entity.Member;
import com.company.genealogy.web.vo.MemberImportVO;
import java.util.List;
import java.util.Map;
import com.company.genealogy.web.vo.MemberTreeNodeVO;
import com.company.genealogy.web.vo.StatisticsVO;
import com.company.genealogy.web.vo.MemberSpouseVO;

public interface MemberService extends IService<Member> {
    
    /**
     * 分页查询成员列表（包含关联名称）
     */
    IPage<Member> getMemberListWithPage(int page, int size, String name, String gender, Long clanId, Long branchId);

    /**
     * 查询成员列表（包含关联名称）
     */
    List<Member> getMemberList(String name, String gender, Long clanId, Long branchId);

    /**
     * 查询成员详情（包含关联名称）
     */
    Member getMemberDetail(Long id);

    /**
     * 批量导入成员
     */
    void importMembers(List<MemberImportVO> importList);

    // 按分支和世代统计人数
    List<Map<String, Object>> countByBranchAndGeneration(Long clanId);
    // 按分支统计总人数
    List<Map<String, Object>> countByBranch(Long clanId);
    
    /**
     * 获取成员的子女列表（按排序）
     */
    List<Member> getChildrenByParentId(Long parentId);
    
    /**
     * 更新子女排序
     */
    boolean updateChildOrder(Long childId, Integer newOrder);
    
    /**
     * 重新排序同一父母下的所有子女
     */
    boolean reorderChildren(Long parentId, List<Long> childIds);
    
    /**
     * 获取树形结构的子节点
     */
    List<MemberTreeNodeVO> getChildrenTreeNodes(Long parentId);
    
    /**
     * 搜索树形结构中的成员
     */
    List<MemberTreeNodeVO> searchTreeByName(String name);
    
    // 子女排序相关方法
    public Integer getNextChildOrder(Long parentId);
    
    // 树形结构相关方法（带权限控制）
    List<MemberTreeNodeVO> getEnhancedTreeNodes(Long parentId);
    List<MemberTreeNodeVO> searchEnhancedTreeByName(String name);
    
    // 获取增强的树形节点（包含配偶信息和分支筛选）
    List<MemberTreeNodeVO> getEnhancedTreeNodes(Long parentId, Long branchId);
    
    // 新增：配偶管理方法
    List<MemberSpouseVO> getMemberSpouses(Long memberId);
    boolean addMemberSpouse(MemberSpouseVO spouseVO);
    boolean updateMemberSpouse(MemberSpouseVO spouseVO);
    boolean deleteMemberSpouse(Long spouseId);
    Integer getNextSpouseOrder(Long memberId);
    
    // 新增：检查是否为子节点关系
    boolean isChildOf(Long childId, Long parentId);
    
    // 新增：统计方法（带权限控制）
    StatisticsVO getStatistics();
} 